/**
 * 判断链表中是否有环,若有环返回环的起点
 * 设 head到环的起点 的距离为l，环的长度为d
 * 当slow位于环的起点时，fast恰好位于环中长度为l的位置，fast追赶上slow的距离为d-l
 * 当fast和slow相遇时，slow位于环中长度为d-l的位置，将fast放到head处
 * 此时快慢指针同时向前走，当fast走l步，slow也走l步时，快慢指针相遇，也就是环的起点处
 * @param {ListNode} head 
 */
var detectCycle = function (head) {
    if (head === null) {
        return null
    }
    // 定义快慢指针
    let slow = head
    let fast = head
    // 表示链表有无环
    let isCycle = false
    // 判断有没有环
    while (fast.next !== null && fast.next.next !== null) {
        slow = slow.next
        fast = fast.next.next
        if (slow === fast) {
            isCycle = true
            break
        }
    }
    // 无环返回空
    if (!isCycle) {
        return null
    }
    // 有环则计算环的起点
    // 令快指针回到起始点,此时快慢指针同时向前走一步，相遇之处就是环的起始点
    fast = head
    while (slow != fast) {
        slow = slow.next
        fast = fast.next
    }
    return fast
}